package org.example.jccluboss.util;

import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.example.jccluboss.entity.FileInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 啊昌
 * @date 2025/4/16 18:09
 * MinioUtil 文件操作工具
 */
@Component
public class MinioUtil {

	@Resource
	private MinioClient minioClient;

	/**
	 * 创建bucket桶
	 */
	public void createBucket(String bucket) throws Exception {
		boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
		if (!exists) {
			minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
		}
	}

	/**
	 * 上传文件
	 */
	public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {
		minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
				.stream(inputStream, -1, 5242889L).build());
	}

	/**
	 * 列出所有桶
	 */
	public List<String> getAllBucket() throws Exception {
		List<Bucket> buckets = minioClient.listBuckets();
		return buckets.stream().map(Bucket::name).collect(Collectors.toList());
	}

	/**
	 * 列出当前桶及文件
	 */
	public List<FileInfo> getAllFile(String bucket) throws Exception {
		Iterable<Result<Item>> results = minioClient.listObjects(
				ListObjectsArgs.builder().bucket(bucket).build());
		List<FileInfo> fileInfoList = new LinkedList<>();
		for (Result<Item> result : results) {
			FileInfo fileInfo = new FileInfo();
			Item item = result.get();
			fileInfo.setFileName(item.objectName());
			fileInfo.setDirectoryFlag(item.isDir());
			fileInfo.setEtag(item.etag());
			fileInfoList.add(fileInfo);
		}
		return fileInfoList;
	}

	/**
	 * 下载文件
	 */
	public InputStream downLoad(String bucket, String objectName) throws Exception {
		return minioClient.getObject(
				GetObjectArgs.builder().bucket(bucket).object(objectName).build()
		);
	}

	/**
	 * 删除桶
	 */
	public void deleteBucket(String bucket) throws Exception {
		minioClient.removeBucket(
				RemoveBucketArgs.builder().bucket(bucket).build()
		);
	}

	/**
	 * 删除文件
	 */
	public void deleteObject(String bucket, String objectName) throws Exception {
		minioClient.removeObject(
				RemoveObjectArgs.builder().bucket(bucket).object(objectName).build()
		);
	}

	/**
	 * 获取文件url
	 */
	public String getPreviewFileUrl(String bucketName, String objectName) throws Exception {
		GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
				.method(Method.GET)
				.bucket(bucketName).object(objectName).build();
		return minioClient.getPresignedObjectUrl(args);
	}

}
